package com.jxpanda.spring.module.wechat.component.message.pojo;

import com.jxpanda.spring.module.wechat.component.message.pojo.xml.WechatXmlTextMessage;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 微信支持的消息类型，以及对应的参数值
 *
 * @author Panda
 */
@Getter
@AllArgsConstructor
public enum MsgType {

    /**
     * 未知消息类型
     */
    UNKNOWN("", "未知消息类型", null),
    /**
     * 文本消息
     */
    TEXT("text", "文本消息", WechatXmlTextMessage.class),
    /**
     * 图片消息
     */
    IMAGE("image", "图片消息", null),
    /**
     * 语音消息
     */
    VOICE("voice", "语音消息", null),
    /**
     * 视频消息
     */
    VIDEO("video", "视频消息", null),
    /**
     * 文件消息
     */
    FILE("file", "文件消息", null),
    /**
     * 文本卡片消息
     */
    TEXT_CARD("textcard", "文本卡片消息", null),
    /**
     * 图文消息
     */
    NEWS("news", "图文消息", null),
    /**
     * 图文消息（mpnews）
     */
    MP_NEWS("mpnews", "图文消息（mpnews）", null),
    /**
     * markdown消息
     */
    MARKDOWN("markdown", "markdown消息", null),
    /**
     * 小程序通知消息
     */
    MINIPROGRAM_NOTICE("miniprogram_notice", "小程序通知消息", null),
    /**
     * 模板卡片消息
     */
    TEMPLATE_CARD("template_card", "模板卡片消息", null);


    private final String value;

    private final String description;

    private final Class<? extends WechatXmlMessage> xmlClass;

    private static final Map<String, MsgType> VALUE_MAP = Arrays.stream(MsgType.values())
            .collect(Collectors.toMap(MsgType::getValue, Function.identity()));

    public Class<? extends WechatXmlMessage> getXmlClass() {
        if (xmlClass == null) {
            throw new UnsupportedOperationException("不支持的消息类型");
        }
        return xmlClass;
    }

    public static MsgType fromValue(String value) {
        return VALUE_MAP.get(value);
    }
}
